home *** CD-ROM | disk | FTP | other *** search
/ Apple Developer Connection 1998 Fall: Game Toolkit / Disc.iso / MPW / Miscellaneous / MPW Goodies / ThreeWayMerge / ThreeWayMerge < prev    next >
Encoding:
Text File  |  1996-02-26  |  3.9 KB  |  132 lines  |  [TEXT/MPS ]

  1. #
  2. #    File:        ThreeWayMerge
  3. #
  4. #    Contains:    xxx put contents here xxx
  5. #
  6. #         This script compares merges two files that are assumed to be 
  7. #         derived from a base file. It does so by comparing both versions
  8. #         with the base, sorting the resulting difference records, and then
  9. #         processing them as actions on the base file.  All changes from
  10. #         both versions are included in the output.  If both versions
  11. #         affect the same lines in the base, then both versions are listed,
  12. #         with ••• marks around the conflict.
  13. #
  14. #
  15. #    Written by:    Jens Alfke, William Cook, and Alex McKale
  16. #
  17. #    Copyright:    © 1992,1995-1996 by Apple Computer, Inc., all rights reserved.
  18. #
  19. #    Change History (most recent first):
  20. #
  21. #         <2>     2/26/96    agm     cleaned up for ETO 20.
  22. #         <1>     5/25/95    jpa        first checked in
  23. #
  24. #    To Do:
  25. #
  26.  
  27. # put out the things changed in the left file
  28. # could easily be changed to include a 'context' factor...
  29. # left = base, right = new
  30.  
  31. if {#} < 3
  32.     echo "usage: {0} <BaseFile> <Version1> <Version2>"
  33.     exit
  34. end
  35.  
  36. set original `files "{1}"`
  37. set new1 `files "{2}"`
  38. set new2 `files "{3}"`
  39. set temp "{TempFolder}ThreeWayMerge•"
  40.  
  41. # compare the two new versions to the root version
  42. # and strip off the root version name
  43. set oldExit {exit}
  44. set exit 0
  45. Equal -q "{original}" "{new1}"
  46. if {status} == 0
  47.     catenate "{new2}"
  48.     exit
  49. end
  50. Equal -q "{original}" "{new2}"
  51. if {status} == 0
  52.     catenate "{new1}"
  53.     exit
  54. end
  55.  
  56. compare -m -t -b "{original}" "{new1}" ∂
  57.     | streamedit -d -e '/•[¬;]*; Line (≈)®1/ print ®1' > "{temp}"1
  58. compare -m -t -b "{original}" "{new2}" ∂
  59.     | streamedit -d -e '/•[¬;]*; Line (≈)®1/ print ®1' > "{temp}"2
  60. set exit {oldExit}
  61.     
  62. # sort the collected modifications by the order of changes
  63. # to the root file
  64. sort -fs " :;Δ" -f 1 -d "{temp}"1 "{temp}"2 > "{temp}"Sorted
  65.  
  66. delete "{temp}"1 "{temp}"2
  67.  
  68. # here we convert the "deltas" into a simple set of
  69. # commands.  For each change entry, we do two things:
  70. #    • output a command to dump the contents of the root
  71. #         file from end of the last change (the start variable)
  72. #        to the beginning of this change.  These commands
  73. #        get a "delete" variable binding too, which indicates
  74. #        where the last change command began deleting from the
  75. #        file.  This lets us go back and print out deleted
  76. #        text in case there was a conflict.
  77. #    • then we make a change command for the new text (if any)
  78. #        from one of the two deltas
  79. streamedit -d ∂
  80.     -e "• ∂
  81.             print 'Set InConflict 0'; ∂
  82.             print 'Set LastChangeEnd -1'; ∂
  83.             print 'Set CopyStart 1'" ∂
  84.     -e "/•([0-9]+)®1;/ ∂
  85.             print 'Set ChangeStart ' ®1; ∂
  86.             print 'Set ChangeEnd ' ®1" ∂
  87.     -e "/•([0-9]+)®1:([0-9]+)®2;/ ∂
  88.             print 'Set ChangeStart ' ®1; ∂
  89.             print 'Set ChangeEnd ' ®2" ∂
  90.     -e "/•Δ([0-9]+)®1;/ ∂
  91.             print 'Set ChangeStart ' ®1; ∂
  92.             print 'Set ChangeEnd ∂`evaluate ' ®1 ' -1∂`'" ∂
  93.     -e "/•([0-9]+)®1Δ;/ ∂
  94.             print 'Set ChangeStart ∂`evaluate ' ®1 ' +1∂`'; ∂
  95.             print 'Set ChangeEnd ' ®1" ∂
  96.     -e "/; File (≈)®3; Line ([0-9]+)®1∞/ ∂
  97.             print 'Set FileName ' ®3; ∂
  98.             print 'Set NewStart ' ®1; ∂
  99.             print 'Set NewEnd ' ®1; ∂
  100.             print 'Execute ThreeWayMerge.Action'" ∂
  101.     -e "/; File (≈)®3; Line ([0-9]+)®1:([0-9]+)®2∞/ ∂
  102.             print 'Set FileName ' ®3; ∂
  103.             print 'Set NewStart ' ®1; ∂
  104.             print 'Set NewEnd ' ®2; ∂
  105.             print 'Execute ThreeWayMerge.Action'" ∂
  106.     -e "/; File (≈)®3; Line Δ([0-9]+)®1∞/ ∂
  107.             print 'Set FileName ' ®3; ∂
  108.             print 'Set NewStart ' ®1; ∂
  109.             print 'Set NewEnd ∂`evaluate ' ®1 ' -1∂`'; ∂
  110.             print 'Execute ThreeWayMerge.Action'" ∂
  111.     -e "/; File (≈)®3; Line ([0-9]+)®1Δ∞/ ∂
  112.             print 'Set FileName ' ®3; ∂
  113.             print 'Set NewStart ∂`evaluate ' ®1 ' +1∂`'; ∂
  114.             print 'Set NewEnd  ' ®1; ∂
  115.             print 'Execute ThreeWayMerge.Action'" ∂
  116.     -e "∞ ∂
  117.             print 'Set FileName ∂"∂"'; ∂
  118.             print 'Set ChangeStart 9999999'; ∂
  119.             print 'Set ChangeEnd 9999999'; ∂
  120.             print 'Set NewStart 9999999'; ∂
  121.             print 'Set NewEnd 9999999'; ∂
  122.             print 'Execute ThreeWayMerge.Action'" ∂
  123.     "{temp}"Sorted > "{temp}Commands"
  124.  
  125. delete "{temp}"Sorted
  126.  
  127. # now execute the program
  128.  
  129. "{temp}Commands"
  130.  
  131. delete "{temp}Commands"
  132.